Slurp	0.9		by Zz Zimmerman

For NTK 1.0b6 (b4 will NOT work).  Slurp is a utility for sending
data to the Newton.  You use your favorite communications application
(i.e. ClarisWorks, MacTerminal) to send a text file to the Newton
over the serial port.  Slurp receives the data, converts each line
into a soup entry, and then stores the result in the soup.  This
version of Slurp only adds records to an existing soup, it does
not create one.  It also assumes that the target soup is a union
soup.

The text file tells Slurp everything it needs to know.  Basically,
the name of the soup to store into, the format of the entries in
that soup (slot names, data types), followed by a list of tab
delimited strings to be converted into entries.  Each line is
assumed to be a complete element.  For example:

	Names
	{cardType: 0, phones: ["string", "string", "string", "string"], email: "string", company: "string", address: "string", address2: "string", city: "string", region: "string", country: "string", postal_code: "string", bday: "date", name: {class: 'person, honorific: "string", first: "string", last: "string", title: "string"}}
	0	111-1111	222-2222	333-3333	444-4444	email	company1	address	address2	city	region	country	postal_code	4/23/62	person	Mr.	Bob1	ADobbs	Dudeface	
	0	111-1111	222-2222	333-3333	444-4444	email	company2	address	address2	city	region	country	postal_code	4/23/62	person	Mr.	Joe2	ADobbs	Dudeface	
	0	111-1111	222-2222	333-3333	444-4444	email	company3	address	address2	city	region	country	postal_code	4/23/62	person	Mr.	Bif3	ADobbs	Dudeface	
	I
	I
	I
	0	111-1111	222-2222	333-3333	444-4444	email	company3	address	address2	city	region	country	postal_code	4/23/62	person	Mr.	Bif3	ADobbs	Dudeface	
	BYE!


The first line:

	Names

is the name of the soup to add the entries to.  In this example, we'll
add some cards to the cardfile's Names soup.

The second line:

	{cardType: 0, phones: ["string", "string", "string", "string"], email: "string", company: "string", address: "string", address2: "string", city: "string", region: "string", country: "string", postal_code: "string", bday: "date", name: {class: 'person, honorific: "string", first: "string", last: "string", title: "string"}}

is a line of NewtonScript that specifies the format of an entry
(ie. entrySpec) for this soup.  The NewtonScript is compiled by 
Slurp, and the resulting frame is used for determining data types.

THE PROBLEM:
	Unfortunately, tab-delimited files are just text, with no real
	type specifications.  Because of this, each slot value comes
	in as a string, and must be converted to the appropriate type.
	The type for each slot value comes from the entrySpec.

The slot values in the entrySpec are sample values that have the
desired class.  For example, if a slot value was to be converted
to an integer, you could store 0 in the entrySpec.  If the slot
value is to be converted into a symbol, you could store 'symbol
in the entrySpec.  Slurp uses the ClassOf function to determine
the desired class, and then converts the string as needed.

PROBLEM #2:	
	Unfortunately, the ClassOf function doesn't always succeed.
	For example, in the case of a date value.  The file has a
	human readable version of the date in a string.  The Names
	soup stores dates as a big integer (the result of the
	StringToDate function).  Storing an integer in the entrySpec
	won't do it.  Slurp needs to know how to convert the string
	into a date.
	
The solution to this problem is less than elegant, but is very
flexible.  When the value in the entrySpec is of type 'string,
the contents of the string are used to specify the type.

For example, if the desired type is string, we use the string:

	"string"

This specifies that the data is to be converted into (or left
as) a simple string.  To specify a different type like 'date,
we use the string:

"date"

The type conversion routine inside Slurp can be extended to
support whatever types you may come up with.

The next lines are tab delimited text that contain the data for the
soup entries.  The data must be specified in the same order as the
sample soup entry.  So in the example, 0 is the cardType, 111-1111 is
the first phone number in the phones array, and so on.  Note
that all the fields are tab-delimited.  There are no braces
or brackets used to specify frames or arrays.

In order to make Slurp disconnect automatically, the last line
of the file is:

BYE!

signalling to Slurp that all the data has been received, and the
connection can now be closed.

To use Slurp, simply download it to your Newton.  Open the communications
program on the Macintosh, and open a connection with the following specs:

  Serial Tool, 9600 baud, 8 data bits, 1 stop bit, XON/XOFF handshaking

You can use the same cable that you use with NTK/Connection.

For file transfer, specify the Text Tool.

Now you are ready to slurp some soup.  

Open Slurp and tap the "Receive..." button.  

On the Mac, choose "Send File..." in the comm program, and choose the 
file to be sent.  Slurp will display the number of entries
received in a view near the top of the screen.  When the file transfer
is complete, Slurp will automatically disconnect.

As for the implementation, the main routines are in:

	protoSerialProtocol	-	InputScripts for receiving data.
	
	nextSlotValue		-	Returns the next piece of data from the
							tab delimited line of text.
							
	matchTypes			-	Coerces a string into a specified type.
							
	buildEntry			-	Recursive routine to convert each string
							from the data file into the correct type
							and store the new value in a frame/entry.
							
	newStatus			-	Displays program information in a static
							text window on the Newton.

	protoVT42			-	This is just a little auto-sizing text
							view useful for displaying status
							messages.  It's based on the "Wrap It
							Up" sample from PIE DTS.

	epInit, epConnect,	-	Global functions for instantiating,
	epDisconnect			connecting and disconnecting an I/O
							endpoint.
							
Caveats/Bugs:

The previous version of this code was pretty ugly, and this is
meant to be a much cleaner and more usable version.  Sorry for
the pre-release.

I still have not been able to call the endpoint :Dispose function
without getting errors.  Calling :Abort followed by :Release seems
to be the best.  Maybe endpoints shouldn't be disposed of?  It
doesn't seem to bother the Toolkit App, so maybe :Release is
enough...

The views in Slurp are mostly debugging windows that I used while
debugging it.  The "Slurp State:" view is the most useful.  The
"Connection State:" view display the results of the :State()
communications function after certain operations.  Tap the 
"Connection State:" label to see the current state.

							
I hope this helps,


...Zz
	
